home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1997 December / PC Pro December 1997 CD-Rom coverdisc.iso / symantec / dbAnywh / JAVA.BIN / CLASSES.ZIP / sun / tools / javac / SourceClass.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-12-14  |  15.2 KB  |  642 lines

  1. package sun.tools.javac;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.DataOutputStream;
  5. import java.io.IOException;
  6. import java.io.OutputStream;
  7. import java.util.Enumeration;
  8. import java.util.Vector;
  9. import sun.tools.asm.Assembler;
  10. import sun.tools.asm.ConstantPool;
  11. import sun.tools.java.ClassDeclaration;
  12. import sun.tools.java.ClassDefinition;
  13. import sun.tools.java.ClassFile;
  14. import sun.tools.java.ClassNotFound;
  15. import sun.tools.java.CompilerError;
  16. import sun.tools.java.Constants;
  17. import sun.tools.java.Environment;
  18. import sun.tools.java.FieldDefinition;
  19. import sun.tools.java.Identifier;
  20. import sun.tools.java.Imports;
  21. import sun.tools.java.Type;
  22. import sun.tools.tree.CompoundStatement;
  23. import sun.tools.tree.Context;
  24. import sun.tools.tree.Node;
  25. import sun.tools.tree.Statement;
  26. import sun.tools.tree.StringExpression;
  27.  
  28. public final class SourceClass extends ClassDefinition {
  29.    Imports imports;
  30.    SourceField defConstructor;
  31.    ConstantPool tab = new ConstantPool();
  32.    private boolean basicChecking = false;
  33.    private boolean basicCheckDone = false;
  34.    private static Vector active = new Vector();
  35.  
  36.    public SourceClass(Environment var1, int var2, ClassDeclaration var3, String var4, int var5, ClassDeclaration var6, ClassDeclaration[] var7, Imports var8) {
  37.       super(var1.getSource(), var2, var3, var5, var6, var7);
  38.       this.imports = var8;
  39.       super.documentation = var4;
  40.    }
  41.  
  42.    public final Imports getImports() {
  43.       return this.imports;
  44.    }
  45.  
  46.    public void addDependency(ClassDeclaration var1) {
  47.       if (this.tab != null) {
  48.          this.tab.put(var1);
  49.       }
  50.  
  51.    }
  52.  
  53.    void checkOverride(Environment var1, ClassDeclaration var2, FieldDefinition var3) throws ClassNotFound {
  54.       ClassDefinition var4 = var2.getClassDefinition(var1);
  55.  
  56.       for(FieldDefinition var5 = var4.getFirstMatch(var3.getName()); var5 != null; var5 = var5.getNextMatch()) {
  57.          if (!var5.isPrivate() && !var5.isVariable() && var3.getType().equalArguments(var5.getType())) {
  58.             if (var5.isFinal()) {
  59.                var1.error(var3.getWhere(), "final.meth.override", var3, var5.getClassDeclaration());
  60.                return;
  61.             }
  62.  
  63.             Type var6 = var3.getType().getReturnType();
  64.             Type var7 = var5.getType().getReturnType();
  65.             if (!var6.equals(var7)) {
  66.                var1.error(var3.getWhere(), "redef.return.type", var3, var5);
  67.                return;
  68.             }
  69.  
  70.             if (var3.isStatic() != var5.isStatic()) {
  71.                String var16 = var5.isStatic() ? "override.static.meth" : "override.instance.method.static";
  72.                var1.error(var3.getWhere(), var16, var5, var5.getClassDeclaration());
  73.                return;
  74.             }
  75.  
  76.             if (!var3.isConstructor()) {
  77.                if (!var3.isPublic() && !var5.isPrivate()) {
  78.                   if (var5.isPublic()) {
  79.                      var1.error(var3.getWhere(), "override.public", var5, var5.getClassDeclaration());
  80.                      return;
  81.                   }
  82.  
  83.                   if (var5.isProtected() && !var3.isProtected()) {
  84.                      var1.error(var3.getWhere(), "override.protected", var5, var5.getClassDeclaration());
  85.                      return;
  86.                   }
  87.  
  88.                   if (var3.isPrivate()) {
  89.                      var1.error(var3.getWhere(), "override.private", var5, var5.getClassDeclaration());
  90.                      return;
  91.                   }
  92.                }
  93.  
  94.                ClassDeclaration[] var8 = var3.getExceptions(var1);
  95.                ClassDeclaration[] var9 = var5.getExceptions(var1);
  96.  
  97.                for(int var10 = 0; var10 < var8.length; ++var10) {
  98.                   ClassDefinition var11 = var8[var10].getClassDefinition(var1);
  99.                   boolean var12 = false;
  100.  
  101.                   for(int var13 = 0; var13 < var9.length; ++var13) {
  102.                      if (var11.subClassOf(var1, var9[var13])) {
  103.                         var12 = true;
  104.                         break;
  105.                      }
  106.                   }
  107.  
  108.                   if (!var12) {
  109.                      var1.error(var3.getWhere(), "invalid.throws", var11, var5, var5.getClassDeclaration());
  110.                      return;
  111.                   }
  112.                }
  113.             }
  114.          }
  115.       }
  116.  
  117.       if (var4.getSuperClass() != null) {
  118.          this.checkOverride(var1, var4.getSuperClass(), var3);
  119.       }
  120.  
  121.       ClassDeclaration[] var14 = var4.getInterfaces();
  122.  
  123.       for(int var15 = 0; var15 < var14.length; ++var15) {
  124.          this.checkOverride(var1, var14[var15], var3);
  125.       }
  126.  
  127.    }
  128.  
  129.    public void addField(Environment var1, FieldDefinition var2) {
  130.       if (var2.isMethod()) {
  131.          if (var2.isConstructor()) {
  132.             if (var2.getClassDefinition().isInterface()) {
  133.                var1.error(var2.getWhere(), "intf.constructor");
  134.                return;
  135.             }
  136.  
  137.             if (var2.isNative() || var2.isAbstract() || var2.isStatic() || var2.isSynchronized() || var2.isFinal()) {
  138.                var1.error(var2.getWhere(), "constr.modifier", var2);
  139.                var2.subModifiers(1336);
  140.             }
  141.          } else if (var2.isInitializer() && var2.getClassDefinition().isInterface()) {
  142.             var1.error(var2.getWhere(), "intf.initializer");
  143.             return;
  144.          }
  145.  
  146.          if (var2.getClassDefinition().isInterface() && (var2.isStatic() || var2.isSynchronized() || var2.isNative() || var2.isFinal() || var2.isPrivate() || var2.isProtected())) {
  147.             var1.error(var2.getWhere(), "intf.modifier.method", var2);
  148.             var2.subModifiers(314);
  149.          }
  150.  
  151.          if (var2.isTransient()) {
  152.             var1.error(var2.getWhere(), "transient.meth", var2);
  153.             var2.subModifiers(128);
  154.          }
  155.  
  156.          if (var2.isVolatile()) {
  157.             var1.error(var2.getWhere(), "volatile.meth", var2);
  158.             var2.subModifiers(64);
  159.          }
  160.  
  161.          if (var2.isStatic() && var2.isAbstract()) {
  162.             var1.error(var2.getWhere(), "static.modifier", var2);
  163.             var2.subModifiers(8);
  164.          }
  165.  
  166.          if (!var2.isAbstract() && !var2.isNative()) {
  167.             if (var2.getValue() == null) {
  168.                if (var2.isConstructor()) {
  169.                   var1.error(var2.getWhere(), "no.constructor.body", var2);
  170.                } else {
  171.                   var1.error(var2.getWhere(), "no.meth.body", var2);
  172.                }
  173.  
  174.                var2.addModifiers(1024);
  175.             }
  176.          } else if (var2.getValue() != null) {
  177.             var1.error(var2.getWhere(), "invalid.meth.body", var2);
  178.             var2.setValue((Node)null);
  179.          }
  180.  
  181.          Vector var3 = var2.getArguments();
  182.          if (var3 != null) {
  183.             int var4 = var3.size();
  184.  
  185.             for(int var5 = 0; var5 < var4; ++var5) {
  186.                FieldDefinition var6 = (FieldDefinition)var3.elementAt(var5);
  187.                if (var6.getType().isType(11)) {
  188.                   var1.error(var6.getWhere(), "void.argument", var6);
  189.                }
  190.             }
  191.          }
  192.       } else {
  193.          if (var2.getType().isType(11)) {
  194.             var1.error(var2.getWhere(), "void.inst.var", var2.getName());
  195.             return;
  196.          }
  197.  
  198.          if (var2.isSynchronized() || var2.isAbstract() || var2.isNative()) {
  199.             var1.error(var2.getWhere(), "var.modifier", var2);
  200.             var2.subModifiers(1312);
  201.          }
  202.  
  203.          if (var2.isTransient() && (var2.isFinal() || var2.isStatic())) {
  204.             var1.error(var2.getWhere(), "transient.modifier", var2);
  205.             var2.subModifiers(24);
  206.          }
  207.  
  208.          if (var2.isFinal() && var2.getValue() == null) {
  209.             var1.error(var2.getWhere(), "initializer.needed", var2);
  210.             var2.subModifiers(16);
  211.          }
  212.  
  213.          if (var2.getClassDefinition().isInterface() && (var2.isPrivate() || var2.isProtected())) {
  214.             var1.error(var2.getWhere(), "intf.modifier.field", var2);
  215.             var2.subModifiers(2);
  216.          }
  217.       }
  218.  
  219.       if (!var2.isInitializer()) {
  220.          for(FieldDefinition var7 = ((ClassDefinition)this).getFirstMatch(var2.getName()); var7 != null; var7 = var7.getNextMatch()) {
  221.             if (!var2.isMethod()) {
  222.                var1.error(var2.getWhere(), "var.multidef", var2, var7);
  223.                return;
  224.             }
  225.  
  226.             if (var2.getType().equals(var7.getType())) {
  227.                var1.error(var2.getWhere(), "meth.multidef", var2);
  228.                return;
  229.             }
  230.  
  231.             if (var2.getType().equalArguments(var7.getType())) {
  232.                var1.error(var2.getWhere(), "meth.redef.rettype", var2, var7);
  233.                return;
  234.             }
  235.          }
  236.       }
  237.  
  238.       ((ClassDefinition)this).addField(var2);
  239.    }
  240.  
  241.    private void addAbstractMethodsFromInterfaces(Environment var1, ClassDefinition var2) throws ClassNotFound {
  242.       if (var2.isInterface()) {
  243.          for(FieldDefinition var3 = var2.getFirstField(); var3 != null; var3 = var3.getNextField()) {
  244.             if (var3.isMethod() && var3.isAbstract() && ((ClassDefinition)this).findMethod(var1, var3.getName(), var3.getType()) == null) {
  245.                SourceField var4 = new SourceField(var3, this, var1);
  246.                this.addField(var1, var4);
  247.             }
  248.          }
  249.       }
  250.  
  251.       ClassDeclaration[] var7 = var2.getInterfaces();
  252.  
  253.       for(int var5 = 0; var5 < var7.length; ++var5) {
  254.          ClassDefinition var6 = var7[var5].getClassDefinition(var1);
  255.          this.addAbstractMethodsFromInterfaces(var1, var6);
  256.       }
  257.  
  258.    }
  259.  
  260.    public void check(Environment var1) throws ClassNotFound {
  261.       Identifier var2 = ((ClassDefinition)this).getClassDeclaration().getName();
  262.       if (var1.verbose()) {
  263.          var1.output("[checking class " + var2 + "]");
  264.       }
  265.  
  266.       this.basicCheck(var1);
  267.       if (((ClassDefinition)this).isPublic()) {
  268.          String var3 = ((ClassDefinition)this).getName().getName() + ".java";
  269.          String var4 = ((ClassFile)((ClassDefinition)this).getSource()).getName();
  270.          if (var1.warnings() && !var4.equals(var3)) {
  271.             var1.error(((ClassDefinition)this).getWhere(), "public.class.file", this, var3);
  272.          }
  273.       }
  274.  
  275.       if (((ClassDefinition)this).isInterface()) {
  276.          if (((ClassDefinition)this).isFinal()) {
  277.             var1.error(((ClassDefinition)this).getWhere(), "final.intf", var2);
  278.          }
  279.       } else if (((ClassDefinition)this).getSuperClass() != null) {
  280.          try {
  281.             ClassDefinition var11 = ((ClassDefinition)this).getSuperClass().getClassDefinition(var1);
  282.             if (!((ClassDefinition)this).canAccess(var1, ((ClassDefinition)this).getSuperClass())) {
  283.                var1.error(((ClassDefinition)this).getWhere(), "cant.access.class", ((ClassDefinition)this).getSuperClass());
  284.                super.superClass = null;
  285.             } else if (var11.isFinal()) {
  286.                var1.error(((ClassDefinition)this).getWhere(), "super.is.final", ((ClassDefinition)this).getSuperClass());
  287.                super.superClass = null;
  288.             } else if (var11.isInterface()) {
  289.                var1.error(((ClassDefinition)this).getWhere(), "super.is.intf", ((ClassDefinition)this).getSuperClass());
  290.                super.superClass = null;
  291.             } else if (((ClassDefinition)this).superClassOf(var1, ((ClassDefinition)this).getSuperClass())) {
  292.                var1.error(((ClassDefinition)this).getWhere(), "cyclic.super");
  293.                super.superClass = null;
  294.             }
  295.          } catch (ClassNotFound var9) {
  296.             var1.error(((ClassDefinition)this).getWhere(), "super.not.found", var9.name, this);
  297.             super.superClass = null;
  298.          }
  299.       }
  300.  
  301.       for(int var12 = 0; var12 < super.interfaces.length; ++var12) {
  302.          ClassDeclaration var13 = super.interfaces[var12];
  303.  
  304.          try {
  305.             if (!((ClassDefinition)this).canAccess(var1, var13)) {
  306.                var1.error(((ClassDefinition)this).getWhere(), "cant.access.class", var13);
  307.             } else if (!var13.getClassDefinition(var1).isInterface()) {
  308.                var1.error(((ClassDefinition)this).getWhere(), "not.intf", var13);
  309.             } else if (((ClassDefinition)this).isInterface() && ((ClassDefinition)this).implementedBy(var1, var13)) {
  310.                var1.error(((ClassDefinition)this).getWhere(), "cyclic.intf", var13);
  311.             }
  312.          } catch (ClassNotFound var8) {
  313.             var1.error(((ClassDefinition)this).getWhere(), "intf.not.found", var8.name, this);
  314.          }
  315.       }
  316.  
  317.       if (!((ClassDefinition)this).getError()) {
  318.          try {
  319.             for(FieldDefinition var14 = ((ClassDefinition)this).getFirstField(); var14 != null; var14 = var14.getNextField()) {
  320.                if (!var14.isVariable()) {
  321.                   if (((ClassDefinition)this).getSuperClass() != null) {
  322.                      this.checkOverride(var1, ((ClassDefinition)this).getSuperClass(), var14);
  323.                   }
  324.  
  325.                   for(int var5 = 0; var5 < super.interfaces.length; ++var5) {
  326.                      this.checkOverride(var1, super.interfaces[var5], var14);
  327.                   }
  328.                }
  329.             }
  330.          } catch (ClassNotFound var10) {
  331.             var1.error(((ClassDefinition)this).getWhere(), "class.not.found", var10.name, this);
  332.          }
  333.  
  334.          if (!((ClassDefinition)this).getError()) {
  335.             if (((ClassDefinition)this).isFinal() && ((ClassDefinition)this).isAbstract()) {
  336.                var1.error(super.where, "final.abstract", ((ClassDefinition)this).getName().getName());
  337.             }
  338.  
  339.             if (!((ClassDefinition)this).isInterface() && !((ClassDefinition)this).isAbstract() && ((ClassDefinition)this).isAbstract(var1)) {
  340.                super.modifiers |= 1024;
  341.                String var15 = ((ClassDefinition)this).isFinal() ? "abstract.class.not.final" : "abstract.class";
  342.                Enumeration var17 = ((ClassDefinition)this).getAbstractFields(var1);
  343.  
  344.                while(var17.hasMoreElements()) {
  345.                   FieldDefinition var6 = (FieldDefinition)var17.nextElement();
  346.                   var1.error(super.where, var15, this, var6, var6.getDefiningClassDeclaration());
  347.                }
  348.             }
  349.  
  350.             for(FieldDefinition var16 = ((ClassDefinition)this).getFirstField(); var16 != null; var16 = var16.getNextField()) {
  351.                try {
  352.                   var16.check(var1);
  353.                } catch (ClassNotFound var7) {
  354.                   var1.error(var16.getWhere(), "class.not.found", var7.name, this);
  355.                }
  356.             }
  357.  
  358.             if (!((ClassDefinition)this).getError()) {
  359.                ;
  360.             }
  361.          }
  362.       }
  363.    }
  364.  
  365.    protected void basicCheck(Environment var1) throws ClassNotFound {
  366.       if (!this.basicChecking && !this.basicCheckDone) {
  367.          this.basicChecking = true;
  368.          var1 = new Environment(var1, this);
  369.          if (((ClassDefinition)this).getSuperClass() != null) {
  370.             try {
  371.                ((ClassDefinition)this).getSuperClass().getClassDefinition(var1);
  372.             } catch (ClassNotFound var7) {
  373.                var1.error(((ClassDefinition)this).getWhere(), "super.not.found", var7.name, this);
  374.                super.superClass = null;
  375.                ((ClassDefinition)this).setError(true);
  376.             }
  377.          }
  378.  
  379.          for(int var2 = 0; var2 < super.interfaces.length; ++var2) {
  380.             try {
  381.                super.interfaces[var2].getClassDefinition(var1);
  382.             } catch (ClassNotFound var6) {
  383.                var1.error(((ClassDefinition)this).getWhere(), "intf.not.found", var6.name, this);
  384.                ClassDeclaration[] var4 = new ClassDeclaration[super.interfaces.length - 1];
  385.                System.arraycopy(super.interfaces, 0, var4, 0, var2);
  386.                System.arraycopy(super.interfaces, var2 + 1, var4, var2, var4.length - var2);
  387.                super.interfaces = var4;
  388.                ((ClassDefinition)this).setError(true);
  389.             }
  390.          }
  391.  
  392.          if (!((ClassDefinition)this).isInterface()) {
  393.             if (((ClassDefinition)this).getFirstMatch(Constants.idInit) == null) {
  394.                CompoundStatement var3 = new CompoundStatement(((ClassDefinition)this).getWhere(), new Statement[0]);
  395.                Type var9 = Type.tMethod(Type.tVoid);
  396.                SourceField var5 = new SourceField(((ClassDefinition)this).getWhere(), this, (String)null, ((ClassDefinition)this).isPublic() ? 1 : 0, var9, Constants.idInit, (Vector)null, new ClassDeclaration[0], var3);
  397.                ((ClassDefinition)this).addField(var5);
  398.             }
  399.  
  400.             if (!((ClassDefinition)this).getError()) {
  401.                this.addAbstractMethodsFromInterfaces(var1, this);
  402.             }
  403.          }
  404.  
  405.          this.basicChecking = false;
  406.          this.basicCheckDone = true;
  407.       }
  408.    }
  409.  
  410.    public void compile(Environment var1, OutputStream var2) throws InterruptedException, IOException {
  411.       Vector var3 = active;
  412.       synchronized(var3){}
  413.  
  414.       try {
  415.          while(active.contains(((ClassDefinition)this).getName())) {
  416.             active.wait();
  417.          }
  418.  
  419.          active.addElement(((ClassDefinition)this).getName());
  420.       } catch (Throwable var28) {
  421.          throw var28;
  422.       }
  423.  
  424.       try {
  425.          this.compileClass(var1, var2);
  426.       } catch (ClassNotFound var26) {
  427.          throw new CompilerError(var26);
  428.       } finally {
  429.          Vector var5 = active;
  430.          synchronized(var5){}
  431.  
  432.          try {
  433.             active.removeElement(((ClassDefinition)this).getName());
  434.             active.notifyAll();
  435.          } catch (Throwable var25) {
  436.             throw var25;
  437.          }
  438.  
  439.       }
  440.  
  441.    }
  442.  
  443.    private void compileClass(Environment var1, OutputStream var2) throws IOException, ClassNotFound {
  444.       var1 = new Environment(var1, this);
  445.       this.check(var1);
  446.       if (!((ClassDefinition)this).getError()) {
  447.          Vector var3 = new Vector();
  448.          Vector var4 = new Vector();
  449.          CompilerField var5 = new CompilerField(new FieldDefinition(((ClassDefinition)this).getWhere(), this, 8, Type.tMethod(Type.tVoid), Constants.idClassInit, new ClassDeclaration[0], (Node)null), new Assembler());
  450.          Context var6 = new Context(var5.field);
  451.  
  452.          for(FieldDefinition var7 = ((ClassDefinition)this).getFirstField(); var7 != null; var7 = var7.getNextField()) {
  453.             try {
  454.                if (var7.isMethod()) {
  455.                   if (var7.isInitializer()) {
  456.                      ((SourceField)var7).code(var1, var5.asm);
  457.                   } else {
  458.                      CompilerField var8 = new CompilerField(var7, new Assembler());
  459.                      ((SourceField)var7).code(var1, var8.asm);
  460.                      var4.addElement(var8);
  461.                   }
  462.                } else {
  463.                   CompilerField var25 = new CompilerField(var7, (Assembler)null);
  464.                   var3.addElement(var25);
  465.                   if (var7.isStatic()) {
  466.                      var7.codeInit(var1, var6, var5.asm);
  467.                   }
  468.                }
  469.             } catch (CompilerError var22) {
  470.                ((Throwable)var22).printStackTrace();
  471.                var1.error(var7, 0, "generic", var7.getClassDeclaration() + ":" + var7 + "@" + ((Throwable)var22).toString(), (Object)null, (Object)null);
  472.             }
  473.          }
  474.  
  475.          if (!var5.asm.empty()) {
  476.             var5.asm.add(((ClassDefinition)this).getWhere(), 177);
  477.             var4.addElement(var5);
  478.          }
  479.  
  480.          if (!((ClassDefinition)this).getError()) {
  481.             this.tab.put("Code");
  482.             this.tab.put("ConstantValue");
  483.             this.tab.put("LocalVariables");
  484.             this.tab.put("SourceFile");
  485.             this.tab.put("Exceptions");
  486.             if (!var1.optimize()) {
  487.                this.tab.put("LineNumberTable");
  488.             }
  489.  
  490.             if (var1.debug()) {
  491.                this.tab.put("LocalVariableTable");
  492.             }
  493.  
  494.             String var26 = ((ClassFile)((ClassDefinition)this).getSource()).getName();
  495.             this.tab.put(var26);
  496.             this.tab.put(((ClassDefinition)this).getClassDeclaration());
  497.             if (((ClassDefinition)this).getSuperClass() != null) {
  498.                this.tab.put(((ClassDefinition)this).getSuperClass());
  499.             }
  500.  
  501.             for(int var9 = 0; var9 < super.interfaces.length; ++var9) {
  502.                this.tab.put(super.interfaces[var9]);
  503.             }
  504.  
  505.             Enumeration var10 = var4.elements();
  506.  
  507.             while(var10.hasMoreElements()) {
  508.                CompilerField var11 = (CompilerField)var10.nextElement();
  509.  
  510.                try {
  511.                   var11.asm.optimize(var1);
  512.                   var11.asm.collect(var1, var11.field, this.tab);
  513.                   this.tab.put(var11.name);
  514.                   this.tab.put(var11.sig);
  515.                   ClassDeclaration[] var12 = var11.field.getExceptions(var1);
  516.  
  517.                   for(int var13 = 0; var13 < var12.length; ++var13) {
  518.                      this.tab.put(var12[var13]);
  519.                   }
  520.                } catch (Exception var23) {
  521.                   ((Throwable)var23).printStackTrace();
  522.                   var1.error(var11.field, -1, "generic", var11.field.getName() + "@" + ((Throwable)var23).toString(), (Object)null, (Object)null);
  523.                   var11.asm.listing(System.out);
  524.                }
  525.             }
  526.  
  527.             Enumeration var27 = var3.elements();
  528.  
  529.             while(var27.hasMoreElements()) {
  530.                CompilerField var28 = (CompilerField)var27.nextElement();
  531.                this.tab.put(var28.name);
  532.                this.tab.put(var28.sig);
  533.                Object var30 = var28.field.getInitialValue();
  534.                if (var30 != null) {
  535.                   this.tab.put(var30 instanceof String ? new StringExpression(var28.field.getWhere(), (String)var30) : var30);
  536.                }
  537.             }
  538.  
  539.             DataOutputStream var29 = new DataOutputStream(var2);
  540.             var29.writeInt(-889275714);
  541.             var29.writeShort(3);
  542.             var29.writeShort(45);
  543.             this.tab.write(var1, var29);
  544.             var29.writeShort(((ClassDefinition)this).getModifiers() & 1553);
  545.             var29.writeShort(this.tab.index(((ClassDefinition)this).getClassDeclaration()));
  546.             var29.writeShort(((ClassDefinition)this).getSuperClass() != null ? this.tab.index(((ClassDefinition)this).getSuperClass()) : 0);
  547.             var29.writeShort(super.interfaces.length);
  548.  
  549.             for(int var31 = 0; var31 < super.interfaces.length; ++var31) {
  550.                var29.writeShort(this.tab.index(super.interfaces[var31]));
  551.             }
  552.  
  553.             ByteArrayOutputStream var14 = new ByteArrayOutputStream(256);
  554.             ByteArrayOutputStream var15 = new ByteArrayOutputStream(256);
  555.             DataOutputStream var16 = new DataOutputStream(var14);
  556.             var29.writeShort(var3.size());
  557.             Enumeration var17 = var3.elements();
  558.  
  559.             while(var17.hasMoreElements()) {
  560.                CompilerField var18 = (CompilerField)var17.nextElement();
  561.                Object var19 = var18.field.getInitialValue();
  562.                var29.writeShort(var18.field.getModifiers() & 223);
  563.                var29.writeShort(this.tab.index(var18.name));
  564.                var29.writeShort(this.tab.index(var18.sig));
  565.                if (var19 != null) {
  566.                   var29.writeShort(1);
  567.                   var29.writeShort(this.tab.index("ConstantValue"));
  568.                   var29.writeInt(2);
  569.                   var29.writeShort(this.tab.index(var19 instanceof String ? new StringExpression(var18.field.getWhere(), (String)var19) : var19));
  570.                } else {
  571.                   var29.writeShort(0);
  572.                }
  573.             }
  574.  
  575.             var29.writeShort(var4.size());
  576.             Enumeration var32 = var4.elements();
  577.  
  578.             while(var32.hasMoreElements()) {
  579.                CompilerField var33 = (CompilerField)var32.nextElement();
  580.                var29.writeShort(var33.field.getModifiers() & 1343);
  581.                var29.writeShort(this.tab.index(var33.name));
  582.                var29.writeShort(this.tab.index(var33.sig));
  583.                ClassDeclaration[] var20 = var33.field.getExceptions(var1);
  584.                if (!var33.asm.empty()) {
  585.                   var29.writeShort(var20.length > 0 ? 2 : 1);
  586.                   var33.asm.write(var1, var16, var33.field, this.tab);
  587.                   int var21 = 0;
  588.                   if (!var1.optimize()) {
  589.                      ++var21;
  590.                   }
  591.  
  592.                   if (var1.debug()) {
  593.                      ++var21;
  594.                   }
  595.  
  596.                   var16.writeShort(var21);
  597.                   if (!var1.optimize()) {
  598.                      var33.asm.writeLineNumberTable(var1, new DataOutputStream(var15), this.tab);
  599.                      var16.writeShort(this.tab.index("LineNumberTable"));
  600.                      var16.writeInt(var15.size());
  601.                      var15.writeTo(var14);
  602.                      var15.reset();
  603.                   }
  604.  
  605.                   if (var1.debug()) {
  606.                      var33.asm.writeLocalVariableTable(var1, var33.field, new DataOutputStream(var15), this.tab);
  607.                      var16.writeShort(this.tab.index("LocalVariableTable"));
  608.                      var16.writeInt(var15.size());
  609.                      var15.writeTo(var14);
  610.                      var15.reset();
  611.                   }
  612.  
  613.                   var29.writeShort(this.tab.index("Code"));
  614.                   var29.writeInt(var14.size());
  615.                   var14.writeTo(var29);
  616.                   var14.reset();
  617.                } else {
  618.                   var29.writeShort(var20.length > 0 ? 1 : 0);
  619.                }
  620.  
  621.                if (var20.length > 0) {
  622.                   var29.writeShort(this.tab.index("Exceptions"));
  623.                   var29.writeInt(2 + var20.length * 2);
  624.                   var29.writeShort(var20.length);
  625.  
  626.                   for(int var34 = 0; var34 < var20.length; ++var34) {
  627.                      var29.writeShort(this.tab.index(var20[var34]));
  628.                   }
  629.                }
  630.             }
  631.  
  632.             var29.writeShort(1);
  633.             var29.writeShort(this.tab.index("SourceFile"));
  634.             var29.writeInt(2);
  635.             var29.writeShort(this.tab.index(var26));
  636.             var29.flush();
  637.             this.tab = null;
  638.          }
  639.       }
  640.    }
  641. }
  642.